// RAP [rh] Products not supported
///*******************************************************************************
// * Copyright (c) 2000, 2007 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.internal.dialogs;
//
//import java.io.IOException;
//import java.net.MalformedURLException;
//import java.net.URL;
//import java.util.ArrayList;
//import java.util.StringTokenizer;
//
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.Platform;
//import org.eclipse.jface.dialogs.TrayDialog;
//import org.eclipse.jface.resource.JFaceColors;
//import org.eclipse.osgi.util.NLS;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.custom.StyleRange;
//import org.eclipse.swt.custom.StyledText;
//import org.eclipse.swt.events.KeyAdapter;
//import org.eclipse.swt.events.KeyEvent;
//import org.eclipse.swt.events.MouseAdapter;
//import org.eclipse.swt.events.MouseEvent;
//import org.eclipse.swt.events.MouseMoveListener;
//import org.eclipse.swt.events.TraverseEvent;
//import org.eclipse.swt.events.TraverseListener;
//import org.eclipse.swt.graphics.Color;
//import org.eclipse.swt.graphics.Cursor;
//import org.eclipse.swt.graphics.Point;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.PartInitException;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.browser.IWebBrowser;
//import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
//import org.eclipse.ui.internal.WorkbenchMessages;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.about.AboutItem;
//import org.eclipse.ui.internal.misc.StatusUtil;
//import org.eclipse.ui.statushandlers.StatusManager;
//
///**
// * Abstract superclass of about dialogs
// */
//
//public abstract class ProductInfoDialog extends TrayDialog {
//
// private AboutItem item;
//
// private Cursor handCursor;
//
// private Cursor busyCursor;
//
// private boolean mouseDown = false;
//
// private boolean dragEvent = false;
//
// /**
// * Create an instance of this Dialog
// */
// public ProductInfoDialog(Shell parentShell) {
// super(parentShell);
// }
//
// /**
// * Adds listeners to the given styled text
// */
// protected void addListeners(StyledText styledText) {
// styledText.addMouseListener(new MouseAdapter() {
// public void mouseDown(MouseEvent e) {
// if (e.button != 1) {
// return;
// }
// mouseDown = true;
// }
//
// public void mouseUp(MouseEvent e) {
// mouseDown = false;
// StyledText text = (StyledText) e.widget;
// int offset = text.getCaretOffset();
// if (dragEvent) {
// // don't activate a link during a drag/mouse up operation
// dragEvent = false;
// if (item != null && item.isLinkAt(offset)) {
// text.setCursor(handCursor);
// }
// } else if (item != null && item.isLinkAt(offset)) {
// text.setCursor(busyCursor);
// openLink(item.getLinkAt(offset));
// StyleRange selectionRange = getCurrentRange(text);
// text.setSelectionRange(selectionRange.start,
// selectionRange.length);
// text.setCursor(null);
// }
// }
// });
//
// styledText.addMouseMoveListener(new MouseMoveListener() {
// public void mouseMove(MouseEvent e) {
// // Do not change cursor on drag events
// if (mouseDown) {
// if (!dragEvent) {
// StyledText text = (StyledText) e.widget;
// text.setCursor(null);
// }
// dragEvent = true;
// return;
// }
// StyledText text = (StyledText) e.widget;
// int offset = -1;
// try {
// offset = text.getOffsetAtLocation(new Point(e.x, e.y));
// } catch (IllegalArgumentException ex) {
// // leave value as -1
// }
// if (offset == -1) {
// text.setCursor(null);
// } else if (item != null && item.isLinkAt(offset)) {
// text.setCursor(handCursor);
// } else {
// text.setCursor(null);
// }
// }
// });
//
// styledText.addTraverseListener(new TraverseListener() {
// public void keyTraversed(TraverseEvent e) {
// StyledText text = (StyledText) e.widget;
// switch (e.detail) {
// case SWT.TRAVERSE_ESCAPE:
// e.doit = true;
// break;
// case SWT.TRAVERSE_TAB_NEXT:
// //Previously traverse out in the backward direction?
// Point nextSelection = text.getSelection();
// int charCount = text.getCharCount();
// if ((nextSelection.x == charCount)
// && (nextSelection.y == charCount)) {
// text.setSelection(0);
// }
// StyleRange nextRange = findNextRange(text);
// if (nextRange == null) {
// // Next time in start at beginning, also used by
// // TRAVERSE_TAB_PREVIOUS to indicate we traversed out
// // in the forward direction
// text.setSelection(0);
// e.doit = true;
// } else {
// text.setSelectionRange(nextRange.start,
// nextRange.length);
// e.doit = true;
// e.detail = SWT.TRAVERSE_NONE;
// }
// break;
// case SWT.TRAVERSE_TAB_PREVIOUS:
// //Previously traverse out in the forward direction?
// Point previousSelection = text.getSelection();
// if ((previousSelection.x == 0)
// && (previousSelection.y == 0)) {
// text.setSelection(text.getCharCount());
// }
// StyleRange previousRange = findPreviousRange(text);
// if (previousRange == null) {
// // Next time in start at the end, also used by
// // TRAVERSE_TAB_NEXT to indicate we traversed out
// // in the backward direction
// text.setSelection(text.getCharCount());
// e.doit = true;
// } else {
// text.setSelectionRange(previousRange.start,
// previousRange.length);
// e.doit = true;
// e.detail = SWT.TRAVERSE_NONE;
// }
// break;
// default:
// break;
// }
// }
// });
//
// //Listen for Tab and Space to allow keyboard navigation
// styledText.addKeyListener(new KeyAdapter() {
// public void keyPressed(KeyEvent event) {
// StyledText text = (StyledText) event.widget;
// if (event.character == ' ' || event.character == SWT.CR) {
// if (item != null) {
// //Be sure we are in the selection
// int offset = text.getSelection().x + 1;
//
// if (item.isLinkAt(offset)) {
// text.setCursor(busyCursor);
// openLink(item.getLinkAt(offset));
// StyleRange selectionRange = getCurrentRange(text);
// text.setSelectionRange(selectionRange.start,
// selectionRange.length);
// text.setCursor(null);
// }
// }
// return;
// }
// }
// });
// }
//
// /**
// * Gets the busy cursor.
// * @return the busy cursor
// */
// protected Cursor getBusyCursor() {
// return busyCursor;
// }
//
// /**
// * Sets the busy cursor.
// * @param busyCursor the busy cursor
// */
// protected void setBusyCursor(Cursor busyCursor) {
// this.busyCursor = busyCursor;
// }
//
// /**
// * Gets the hand cursor.
// * @return Returns a hand cursor
// */
// protected Cursor getHandCursor() {
// return handCursor;
// }
//
// /**
// * Sets the hand cursor.
// * @param handCursor The hand cursor to set
// */
// protected void setHandCursor(Cursor handCursor) {
// this.handCursor = handCursor;
// }
//
// /**
// * Gets the about item.
// * @return the about item
// */
// protected AboutItem getItem() {
// return item;
// }
//
// /**
// * Sets the about item.
// * @param item about item
// */
// protected void setItem(AboutItem item) {
// this.item = item;
// }
//
// /**
// * Find the range of the current selection.
// */
// protected StyleRange getCurrentRange(StyledText text) {
// StyleRange[] ranges = text.getStyleRanges();
// int currentSelectionEnd = text.getSelection().y;
// int currentSelectionStart = text.getSelection().x;
//
// for (int i = 0; i < ranges.length; i++) {
// if ((currentSelectionStart >= ranges[i].start)
// && (currentSelectionEnd <= (ranges[i].start + ranges[i].length))) {
// return ranges[i];
// }
// }
// return null;
// }
//
// /**
// * Find the next range after the current
// * selection.
// */
// protected StyleRange findNextRange(StyledText text) {
// StyleRange[] ranges = text.getStyleRanges();
// int currentSelectionEnd = text.getSelection().y;
//
// for (int i = 0; i < ranges.length; i++) {
// if (ranges[i].start >= currentSelectionEnd) {
// return ranges[i];
// }
// }
// return null;
// }
//
// /**
// * Find the previous range before the current selection.
// */
// protected StyleRange findPreviousRange(StyledText text) {
// StyleRange[] ranges = text.getStyleRanges();
// int currentSelectionStart = text.getSelection().x;
//
// for (int i = ranges.length - 1; i > -1; i--) {
// if ((ranges[i].start + ranges[i].length - 1) < currentSelectionStart) {
// return ranges[i];
// }
// }
// return null;
// }
//
// /**
// * display an error message
// */
// private void openWebBrowserError(final String href, final Throwable t) {
// String title = WorkbenchMessages.ProductInfoDialog_errorTitle;
// String msg = NLS.bind(
// WorkbenchMessages.ProductInfoDialog_unableToOpenWebBrowser,
// href);
// IStatus status = WorkbenchPlugin.getStatus(t);
// StatusUtil.handleStatus(status, title + ": " + msg, StatusManager.SHOW, //$NON-NLS-1$
// getShell());
// }
//
// /**
// * Open a link
// */
// protected void openLink(String href) {
// // format the href for an html file (file:///<filename.html>
// // required for Mac only.
// if (href.startsWith("file:")) { //$NON-NLS-1$
// href = href.substring(5);
// while (href.startsWith("/")) { //$NON-NLS-1$
// href = href.substring(1);
// }
// href = "file:///" + href; //$NON-NLS-1$
// }
// IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
// try {
// IWebBrowser browser = support.getExternalBrowser();
// browser.openURL(new URL(urlEncodeForSpaces(href.toCharArray())));
// }
// catch (MalformedURLException e) {
// openWebBrowserError(href, e);
// }
// catch (PartInitException e) {
// openWebBrowserError(href, e);
// }
// }
//
// /**
// * This method encodes the url, removes the spaces from the url and replaces
// * the same with <code>"%20"</code>. This method is required to fix Bug
// * 77840.
// *
// * @since 3.0.2
// */
// private String urlEncodeForSpaces(char[] input) {
// StringBuffer retu = new StringBuffer(input.length);
// for (int i = 0; i < input.length; i++) {
// if (input[i] == ' ') {
// retu.append("%20"); //$NON-NLS-1$
// } else {
// retu.append(input[i]);
// }
// }
// return retu.toString();
// }
//
// /**
// * Open a browser with the argument title on the argument url. If the url refers to a
// * resource within a bundle, then a temp copy of the file will be extracted and opened.
// * @see <code>Platform.asLocalUrl</code>
// * @param url The target url to be displayed, null will be safely ignored
// * @return true if the url was successfully displayed and false otherwise
// */
// protected boolean openBrowser(URL url) {
// if (url != null) {
// try {
// url = Platform.asLocalURL(url);
// } catch (IOException e) {
// return false;
// }
// }
// if (url == null) {
// return false;
// }
// openLink(url.toString());
// return true;
// }
//
// /**
// * Sets the styled text's bold ranges
// */
// protected void setBoldRanges(StyledText styledText, int[][] boldRanges) {
// for (int i = 0; i < boldRanges.length; i++) {
// StyleRange r = new StyleRange(boldRanges[i][0], boldRanges[i][1],
// null, null, SWT.BOLD);
// styledText.setStyleRange(r);
// }
// }
//
// /**
// * Sets the styled text's link (blue) ranges
// */
// protected void setLinkRanges(StyledText styledText, int[][] linkRanges) {
// Color fg = JFaceColors.getHyperlinkText(styledText.getShell()
// .getDisplay());
// for (int i = 0; i < linkRanges.length; i++) {
// StyleRange r = new StyleRange(linkRanges[i][0], linkRanges[i][1],
// fg, null);
// styledText.setStyleRange(r);
// }
// }
//
// /**
// * Scan the contents of the about text
// */
// protected AboutItem scan(String s) {
// ArrayList linkRanges = new ArrayList();
// ArrayList links = new ArrayList();
//
// // slightly modified version of jface url detection
// // see org.eclipse.jface.text.hyperlink.URLHyperlinkDetector
//
// int urlSeparatorOffset= s.indexOf("://"); //$NON-NLS-1$
// while(urlSeparatorOffset >= 0) {
//
// boolean startDoubleQuote= false;
//
// // URL protocol (left to "://")
// int urlOffset= urlSeparatorOffset;
// char ch;
// do {
// urlOffset--;
// ch= ' ';
// if (urlOffset > -1)
// ch= s.charAt(urlOffset);
// startDoubleQuote= ch == '"';
// } while (Character.isUnicodeIdentifierStart(ch));
// urlOffset++;
//
//
// // Right to "://"
// StringTokenizer tokenizer= new StringTokenizer(s.substring(urlSeparatorOffset + 3), " \t\n\r\f<>", false); //$NON-NLS-1$
// if (!tokenizer.hasMoreTokens())
// return null;
//
// int urlLength= tokenizer.nextToken().length() + 3 + urlSeparatorOffset - urlOffset;
//
// if (startDoubleQuote) {
// int endOffset= -1;
// int nextDoubleQuote= s.indexOf('"', urlOffset);
// int nextWhitespace= s.indexOf(' ', urlOffset);
// if (nextDoubleQuote != -1 && nextWhitespace != -1)
// endOffset= Math.min(nextDoubleQuote, nextWhitespace);
// else if (nextDoubleQuote != -1)
// endOffset= nextDoubleQuote;
// else if (nextWhitespace != -1)
// endOffset= nextWhitespace;
// if (endOffset != -1)
// urlLength= endOffset - urlOffset;
// }
//
// linkRanges.add(new int[] { urlOffset, urlLength });
// links.add(s.substring(urlOffset, urlOffset+urlLength));
//
// urlSeparatorOffset= s.indexOf("://", urlOffset+urlLength+1); //$NON-NLS-1$
// }
// return new AboutItem(s, (int[][]) linkRanges.toArray(new int[linkRanges
// .size()][2]), (String[]) links
// .toArray(new String[links.size()]));
// }
//
// /*
// * (non-Javadoc)
// * @see org.eclipse.jface.dialogs.Dialog#isResizable()
// */
// protected boolean isResizable() {
// return true;
// }
//}